package 字符流;


import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class File的以字符数组读入数据 {
    @Test
    public void test1()  {
        FileReader fr1= null;
        try {
            //创建操作对象
            File f1=new File("hello.txt");
            //提供具体的输入流
            fr1 = new FileReader(f1);
            //输入数据
            char[] chr=new char[5];//每次字符输入的长度就整个数组的长度
            int len;
            //fr1.read(chr):返回读入数组字符数据的个数len,若到达流末尾，则先返回已读取的个数，再返回-1
            //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾，返回-1（就算没有读满数组，也要先返回读取的数据个数，然后再返回-1）
            while ((len= fr1.read(chr))!=-1){
                System.out.println(len);
                System.out.println("---------------");
                for (int i = 0; i < len; i++) {
                    System.out.print(chr[i]);
                }
                System.out.println();
            }
                System.out.println("---------------");
            System.out.println(len);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        //关闭资源
            if (fr1 != null) {
                try {
                    fr1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

    }

    @Test
    public void test2() {
        FileReader fr1 = null;
        try {
            //创建操作对象
            File f1 = new File("hello.txt");
            //提供具体的输入流
            fr1 = new FileReader(f1);
            //输入数据
            char[] chr = new char[5];//每次字符输入的长度就整个数组的长度
            int len;
            //fr1.read(chr):返回读入数组字符数据的个数len,若到达流末尾，则先返回已读取的个数，再返回-1
            /**
             * FileReader类中的 read(char[] arr)方法作用:
             *    （1）返回每次读入arr数组中的字符的个数，若arr数组存满或者达到文件末尾，就会结束本次调用；
             *          （一般数组最大值就是返回读取的字符个数，除非循环到最后一次读取字符数据到数组中，不一定为数组最大值）
             *    （2）当下次相同对象调用该方法的时候，会接着从上次读取数据的最后开始，接着读取文件数据；
             *          若arr数组存满或者达到文件末尾，就会结束本次调用；
             *    （3）若读取文件数据达到末尾，则本次调用先返回，已读取的字符个数；
             *          当下次再调用的时候，才返回 -1。
             */
            while ((len = fr1.read(chr)) != -1) {
                System.out.println(len);
                System.out.println("---------------");
//                for (int i = 0; i < len; i++) {
//                    System.out.print(chr[i]);
//                }
//
//                System.out.println();
//            }
//            System.out.println("---------------");
//            System.out.println(len);
                /**
                 *  String(char[] value, int offset, int count):
                 *      在字符数组value中，从偏移量offset开始（包含开始字符）,取出count个字符拼接成一个字符串，然后返回调用者
                 */
                String str = new String(chr,0,len);
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            if (fr1 != null) {
                try {
                    fr1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

    }

}
